package ftp.provisioner; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; import org.springframework.amqp.core.*; import org.springframework.amqp.rabbit.connection.ConnectionFactory; import org.springframework.amqp.rabbit.core.RabbitTemplate; import org.springframework.amqp.support.converter.Jackson2JsonMessageConverter; import org.springframework.beans.factory.InitializingBean; import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.integration.annotation.IntegrationComponentScan; import org.springframework.integration.channel.DirectChannel; import org.springframework.integration.dsl.IntegrationFlow; import org.springframework.integration.dsl.IntegrationFlows; import org.springframework.integration.dsl.amqp.Amqp; import org.springframework.integration.transformer.GenericTransformer; import org.springframework.messaging.MessageChannel; @Configuration @IntegrationComponentScan public class FtpServerProvisionerClientAutoConfiguration { public static final String PROVISION_REQUESTS_CHANNEL_NAME = "provision-ftp"; @Value("${ftp.amqp.requests}") private String ftpRequests; @Bean InitializingBean ampqInitializer(AmqpAdmin admin) { return () -> this.prepareQueues(admin); } @Bean(name = PROVISION_REQUESTS_CHANNEL_NAME) @ConditionalOnMissingBean(value = MessageChannel.class, name = PROVISION_REQUESTS_CHANNEL_NAME) MessageChannel provisionFtpRequestsChannel() { return new DirectChannel(); } @Bean @ConditionalOnMissingBean RabbitTemplate rabbitTemplate(ConnectionFactory connectionFactory) { RabbitTemplate rabbitTemplate = new RabbitTemplate(connectionFactory); rabbitTemplate.setMessageConverter(new Jackson2JsonMessageConverter()); return rabbitTemplate; } @Bean IntegrationFlow provisionFtpRequestsFlow(AmqpTemplate amqpTemplate) { return IntegrationFlows.from(PROVISION_REQUESTS_CHANNEL_NAME) .transform(FtpServerProvisionerRequest.class, new GenericTransformer<FtpServerProvisionerRequest, String>() { @Override public String transform(FtpServerProvisionerRequest source) { try { ObjectMapper om = new ObjectMapper(); return om.writer().writeValueAsString(source); } catch (JsonProcessingException e) { throw new RuntimeException(e); } } }) .handle(Amqp.outboundGateway(amqpTemplate).routingKey(this.ftpRequests)) .get(); } protected void prepareQueues(AmqpAdmin amqpAdmin) { Queue queue = new Queue(this.ftpRequests, true); DirectExchange exchange = new DirectExchange(this.ftpRequests); Binding binding = BindingBuilder.bind(queue).to(exchange).with(this.ftpRequests); amqpAdmin.declareQueue(queue); amqpAdmin.declareExchange(exchange); amqpAdmin.declareBinding(binding); } }